home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Language/OS - Multiplatform Resource Library
/
LANGUAGE OS.iso
/
gnu
/
nethack.lha
/
nethack-3.1
/
src
/
write.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-09-30
|
5KB
|
198 lines
/* SCCS Id: @(#)write.c 3.1 91/01/04
/* NetHack may be freely redistributed. See license for details. */
#include "hack.h"
static int FDECL(cost,(struct obj *));
/*
* returns basecost of a scroll or a spellbook
*/
static int
cost(otmp)
register struct obj *otmp;
{
if (otmp->oclass == SPBOOK_CLASS)
return(10 * objects[otmp->otyp].oc_level);
switch(otmp->otyp) {
# ifdef MAIL
case SCR_MAIL:
return(2);
/* break; */
# endif
case SCR_LIGHT:
case SCR_GOLD_DETECTION:
case SCR_FOOD_DETECTION:
case SCR_MAGIC_MAPPING:
case SCR_AMNESIA:
case SCR_FIRE:
return(8);
/* break; */
case SCR_DESTROY_ARMOR:
case SCR_CREATE_MONSTER:
case SCR_PUNISHMENT:
return(10);
/* break; */
case SCR_CONFUSE_MONSTER:
return(12);
/* break; */
case SCR_IDENTIFY:
return(14);
/* break; */
case SCR_ENCHANT_ARMOR:
case SCR_REMOVE_CURSE:
case SCR_ENCHANT_WEAPON:
case SCR_CHARGING:
return(16);
/* break; */
case SCR_SCARE_MONSTER:
case SCR_TAMING:
case SCR_TELEPORTATION:
return(20);
/* break; */
case SCR_GENOCIDE:
return(30);
/* break; */
case SCR_BLANK_PAPER:
default:
impossible("You can't write such a weird scroll!");
}
return(1000);
}
static const char NEARDATA write_on[] = { SCROLL_CLASS, SPBOOK_CLASS, 0 };
int
dowrite(pen)
register struct obj *pen;
{
register struct obj *paper;
char namebuf[BUFSZ], scrbuf[BUFSZ];
register struct obj *new_obj;
int basecost, actualcost;
int curseval;
char qbuf[QBUFSZ];
if(!pen)
return(0);
/* already tested before only call of dowrite() (from doapply())
if(pen->otyp != MAGIC_MARKER) {
You("can't write with that!");
return(0);
}
*/
/* get paper to write on */
paper = getobj(write_on,"write on");
if(!paper)
return(0);
if(Blind && !paper->dknown) {
You("can't tell if that %s's blank or not!",
paper->oclass == SPBOOK_CLASS ? "spellbook" :
"scroll");
return(1);
}
paper->dknown = 1;
if(paper->otyp != SCR_BLANK_PAPER && paper->otyp != SPE_BLANK_PAPER) {
You("fool, that %s's not blank!",
paper->oclass == SPBOOK_CLASS ? "spellbook" :
"scroll");
return(1);
}
/* what to write */
Sprintf(qbuf, "What type of %s do you want to write? ",
paper->oclass == SPBOOK_CLASS ? "spellbook" :
"scroll");
getlin(qbuf, namebuf);
if(namebuf[0] == '\033' || !namebuf[0])
return(1);
scrbuf[0] = '\0';
if (paper->oclass == SPBOOK_CLASS) {
if(strncmp(namebuf,"spellbook of ",13) != 0)
Strcpy(scrbuf,"spellbook of ");
}
else if(strncmp(namebuf,"scroll of ",10) != 0)
Strcpy(scrbuf,"scroll of ");
Strcat(scrbuf,namebuf);
new_obj = readobjnam(scrbuf);
new_obj->bknown = (paper->bknown && pen->bknown);
if((new_obj->oclass != SCROLL_CLASS ||
new_obj->otyp == SCR_BLANK_PAPER)
&& (new_obj->oclass != SPBOOK_CLASS ||
new_obj->otyp == SPE_BLANK_PAPER)) {
You("can't write that!");
pline("It's obscene!");
obfree(new_obj, (struct obj *) 0); /* pb@ethz.uucp */
return(1);
}
/* see if there's enough ink */
basecost = cost(new_obj);
if(pen->spe < basecost/2) {
Your("marker is too dry to write that!");
obfree(new_obj, (struct obj *) 0);
return(1);
}
/* we're really going to write now, so calculate cost
*/
actualcost = rn1(basecost/2,basecost/2);
curseval = bcsign(pen) + bcsign(paper);
exercise(A_WIS, TRUE);
/* dry out marker */
if(pen->spe < actualcost) {
Your("marker dries out!");
/* scrolls disappear, spellbooks don't */
if (paper->oclass == SPBOOK_CLASS)
pline("The spellbook is left unfinished.");
else {
pline("The scroll is now useless and disappears!");
useup(paper);
}
pen->spe = 0;
obfree(new_obj, (struct obj *) 0);
return(1);
}
pen->spe -= actualcost;
/* can't write if we don't know it - unless we're lucky */
if(!(objects[new_obj->otyp].oc_name_known) &&
!(objects[new_obj->otyp].oc_uname) &&
(rnl(pl_character[0] == 'W' ? 3 : 15))) {
You("don't know how to write that!");
/* scrolls disappear, spellbooks don't */
if (paper->oclass == SPBOOK_CLASS)
You("write in your best handwriting: \"My Diary\".");
else {
You("write \"%s was here!\" and the scroll disappears.",plname);
useup(paper);
}
obfree(new_obj, (struct obj *) 0);
return(1);
}
/* useup old scroll / spellbook */
useup(paper);
/* now you know it! */
makeknown(new_obj->otyp);
/* success */
new_obj = addinv(new_obj);
new_obj->blessed = (curseval > 0);
new_obj->cursed = (curseval < 0);
prinv(NULL, new_obj, 1L);
#ifdef MAIL
if (new_obj->otyp == SCR_MAIL) new_obj->spe = 1;
#endif
new_obj->known = 1;
return(1);
}
/*write.c*/